package goem

import (
	"log"
)

// type-of:  bool-vector, buffer, char-table, compiled-function, cons, finalizer, float, font-entity, font-object, font-spec, frame, hash-table, integer, marker, overlay, process, string, subr, symbol, vector, window, or window-configuration.
// Programming Types:
var EVTypeInt Value
var EVTypeFloat Value

// var EVTypeChar Value // = Int
var EVTypeSymbol Value

// var EVTypeSeqence Value
// var EVTypeList Value
var EVTypeCons Value
var EVTypeSubr Value
var EVTypeCompiledFunction Value

// var EVTypeArray Value
var EVTypeString Value
var EVTypeVector Value
var EVTypeCharTable Value
var EVTypeBoolVector Value
var EVTypeHashTable Value

// var EVTypeFunc Value
// var EVTypeMacro Value
// var EVTypePrimitiveFunc Value
// var EVTypeByteCode Value
// var EVTypeAutoload Value
var EVTypeFinalizer Value

// Editing Types:
var EVTypeBuffer Value
var EVTypeMarker Value
var EVTypeWindow Value
var EVTypeFrame Value

// var EVTypeTerminal Value
var EVTypeWindowConfiguration Value

// var EVTypeFrameConfiguration Value
var EVTypeProcess Value

// var EVTypeStream Value
// var EVTypeKeymap Value
var EVTypeOverlay Value
var EVTypeFontEntity Value
var EVTypeFontObject Value
var EVTypeFontSpec Value

// var EVTypeExpr Value // like setq special form

// var EVTypeMap Value
// var EVTypeUnknown Value

func types_init() {
	env := emrt.env

	EVTypeInt = MkInt(0).Type()
	EVTypeFloat = MkFloat(1.0).Type()
	EVTypeString = MkStr("goem").Type()
	// EVTypeChar = env.Funcall(env.Intern("string-to-char"), []Value{MkStr("goem")}).Type()
	EVTypeSymbol = env.Intern("not-existed-one").Type()
	EVTypeVector = env.Funcall(env.Intern("vector"), nil).Type()
	EVTypeBoolVector = env.Funcall(env.Intern("bool-vector"), nil).Type()
	EVTypeCons = env.Funcall(env.Intern("split-string"), []Value{MkStr("goem")}).Type()
	// EVTypeFunc = symbolValue(env.Intern("make-finalizer")).Type()
	// EVTypePrimitiveFunc = symbolValue(env.Intern("car")).Type()
	// EVTypeExpr = builtin_fns["setq"].Type()
	// EVTypeMacro = builtin_fns["setq-local"].Type()
	symvalfn := env.Intern("symbol-value")
	// alistv := env.Funcall(symvalfn, []Value{env.Intern("process-environment")})
	// EVTypeList = alistv.Type()
	achartab := env.Funcall(symvalfn, []Value{env.Intern("glyphless-char-display")})
	EVTypeCharTable = achartab.Type()
	// aarray := env.Funcall(symvalfn, []Value{env.Intern("obarray")})
	// EVTypeArray = aarray.Type()
	env.NonLocalExitClear()
	// amap := env.Funcall(symvalfn, []Value{env.Intern("electric-future-map")})
	// EVTypeMap = amap.Type()
	// env.NonLocalExitClear()
	// aunknown := env.Funcall(symvalfn, []Value{env.Intern("generate-autoload-cookie")})
	// EVTypeUnknown = aunknown.Type()
	// EVTypeList = env.Funcall(env.Intern("list"), nil).Type()
	EVTypeHashTable = env.Funcall(env.Intern("make-hash-table"), nil).Type()
	EVTypeFinalizer = env.Funcall(env.Intern("make-finalizer"), []Value{Value{}}).Type()
	EVTypeBuffer = env.Funcall(env.Intern("current-buffer"), nil).Type()
	EVTypeWindow = env.Funcall(env.Intern("selected-window"), nil).Type()
	EVTypeFrame = env.Funcall(env.Intern("selected-frame"), nil).Type()
	EVTypeMarker = env.Funcall(env.Intern("make-marker"), nil).Type()
	// EVTypeOverlay = env.Funcall(env.Intern("make-overlay"), []Value{MkInt(1), MkInt(9)}).Type()
	env.NonLocalExitClear()

	types_check()
}

func types_check() {
	types := []Value{
		EVTypeInt,
		EVTypeFloat,
		EVTypeString,
		EVTypeSymbol,
		EVTypeVector,
		EVTypeBoolVector,
		EVTypeCons,
		// EVTypeFunc,
		// EVTypePrimitiveFunc,
		// EVTypeMacro,
		// EVTypeList,
		EVTypeCharTable,
		EVTypeHashTable,
		EVTypeFinalizer,
		EVTypeBuffer,
		EVTypeWindow,
		EVTypeFrame,
		EVTypeMarker,
		// EVTypeOverlay,
		// EVTypeArray,
		// EVTypeMap,
		// EVTypeUnknown,
	}
	log.Println(len(types), types)
	for i := 0; i < len(types); i++ {
		for j := i + 1; j < len(types); j++ {
			if types[i] == types[j] {
				log.Println("types failed:", i, j, types[i], types[j])
			}
		}
	}
	// log.Fatalln("test")
}
